package com.atguigu.rabbitmq.three;

import com.atguigu.rabbitmq.utils.RabbitMqUtils;
import com.atguigu.rabbitmq.utils.SleepUtils;
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/*
* 消费者
* 这里测试的目的是：
* 消息在手动应答时，是不丢失的，放回队列里面重新消费
* */
public class Worker03 {

    /*队列名称*/
    public static final String TASK_QUEUE_NAME="ack_queue";

    /*接收消息*/
    public static void main(String[] args) throws IOException, TimeoutException {
        Channel channel = RabbitMqUtils.getChannel();
        System.out.println("C1等待接收消息，时间较短：");

        /*消费者接收消息的回调函数*/
        DeliverCallback deliverCallback=(consumerTag,message)->{
            /*沉睡1s*/
            SleepUtils.sleep(1);
            System.out.println("接收到的消息："+new String(message.getBody(),"UTF-8"));

            /*消费端通过信道手动应答*/
            /*
            * 参数解释：
            * 1.消息的标记，表示我标识的是哪一个消息：tag
            * 2.消费端是否批量应答，false表示的是不批量应答信道里面的消息，true表示批量应答信道里面的消息
            * */
            channel.basicAck(message.getEnvelope().getDeliveryTag(),false);

        };

        /*消费者取消消费，接口回调逻辑*/
        CancelCallback cancelCallback=consumerTag->{
            System.out.println("消费者取消消费，接口回调逻辑："+consumerTag);
        };
        /*设置消费端的不公平分发，打破消费端的轮巡规则*/
        /*这里写成1就是不公平分发，写成0就是公平分发，写成其他数字就表示欲取值*/
        /*比如写成2就表示，只消费两条信息*/
        channel.basicQos(2);/*channel信道里面只能有这么多条没有被确认的消息*/
        /*这里消费消息的时候采用手动应答*/
        boolean autoAck=false;
        channel.basicConsume(TASK_QUEUE_NAME,autoAck,deliverCallback,cancelCallback);
    }

}